import Dialogue from './dialogue'

export default class AiModel extends Dialogue {
  constructor() {
    super()
    this.models = {}
    this.messages = new Map()
  }
  // 加载模型
  async loadModel(apiUrl) {
    const name = encodeURIComponent(apiUrl)
    if (this.models[name]) {
      return this.models[name]
    }
    const model = this.createDialogue(apiUrl)
    this.models[name] = this.modelCall(model)
    return this.models[name]
  }
  // 获取模型
  async getModel(apiUrl) {
    const name = encodeURIComponent(apiUrl)
    const model = await this.loadModel(name)
    return model
  }
  // 模型调用 处理
  async modelCall(model) {
    const { messages } = this
    // 消息处理
    return (msg, chatId, options = { roleSetting: '', apiKey: '' }) => {
      return new Promise((resolve, reject) => {
        const { roleSetting, ...opts } = options
        const handled = this.messageHandle(msg, chatId, roleSetting)
        model(handled, opts)
          .then((res) => {
            messages.get(chatId).push({ role: 'assistant', content: res })
            resolve(res)
          })
          .catch((err) => {
            reject(err)
          })
      })
    }
  }
  // 消息处理
  messageHandle(msg, chatId, roleSetting) {
    const { messages } = this
    // 如果 messages 数组过长删除前面的消息
    if (messages.has(chatId) && messages.get(chatId).length > 10) {
      // messages.get(chatId).shift()
      // 删除第二条消息，第一条是角色设定不能删除
      messages.get(chatId).splice(1, 1)
    }
    // AI对话 连续对话 处理
    msg = { role: 'user', content: msg }
    // 角色设定
    if (roleSetting) {
      roleSetting = {
        role: 'system',
        content: '请严格按照以下的描述进行接下来的对话。' + roleSetting
      }
    }
    // messages.set(chatId, roleSetting)
    if (!messages.has(chatId)) {
      // 如果有角色设定
      messages.set(chatId, roleSetting ? [roleSetting, msg] : [msg])
    } else {
      roleSetting && messages.get(chatId).splice(0, 1, roleSetting)
      messages.get(chatId)?.push(msg)
    }
    return [...messages.get(chatId)]
  }
}
